# -*- coding: utf-8 -*-
# @Time    : 2018/4/7 20:23
# @Author  : Soft
# @File    : Controller.py
# @Software: PyCharm
# #Desc    :
from math import radians, cos, sin, asin, sqrt

from flask import request, jsonify

from module.class_.service import ClzService
from module.location import location, log
from module.location.Service import LocalService
from config import LC_LIMIT

from module.cache import cache

cache.set("local", True)

# lng 经度  lat 纬度

@location.route('/add', methods=['post'])
def addLocation():
    try:
        longitude = float(request.form.get('lng'))
        latitude = float(request.form.get('lat'))
        location_name = request.form.get('name')
        if longitude != 0 and latitude != 0:
            jwd = dict(lng=longitude, lat=latitude)
            if LocalService.add(lng=longitude, lat=latitude, location_name=location_name):
                return jsonify(status=True, data=jwd)
        return jsonify(status=False, msg="没有要被保存的位置信息")
    except BaseException as be:
        log.error("set location error. %s" % be)
    return jsonify(status=False, msg="位置名称已经存在？")


@location.route('/delete/<lid>', methods=['post'])
def delete(lid):
    try:
        if len(ClzService.query_sql("select * from class where l_id = %s", lid)) <= 0:
            if LocalService.remove(lid):
                return jsonify(status=True)
        return jsonify(status=False, msg="该位置正在被使用 无法删除！")
    except BaseException as e:
        log.error("delete error. %s" % e)
    return jsonify(status=False, msg="删除位置信息失败！")


@location.route('/get/<lid>', methods=['post'])
def getLocationById(lid):
    try:
        local = LocalService.getOne(lid)
        if local:
            return jsonify(status=True, data=local)
    except BaseException as e:
        log.error('get location is error. %s' % e)
    return jsonify(status=False, msg="数据库中没有该地区的位置信息，请先录入位置")


@location.route('/check/<kid>', methods=['post'])
def checkLocal(kid):
    try:
        nlng = float(request.form.get('lng'))
        nlat = float(request.form.get('lat'))
        clz = ClzService.getById(kid)
        if clz:
            lng = clz.location.lng
            lat = clz.location.lat
            lc = haversine(dict(lng=nlng, lat=nlat), dict(lng=lng, lat=lat))
            if lc < LC_LIMIT:
                return jsonify(status=True, msg='在允许范围内', lc=lc)
            return jsonify(status=False, msg='请在规定地方进行签到')
        return jsonify(status=False, msg='课程信息有误')
    except BaseException as e:
        log.error('不知道啥错误. %s' % e)
    return jsonify(status=False, msg='访问数据有错')


# 位置控制开关
@location.route("/switch/<can>", methods=['post'])
def switch(can):
    if int(can) > 0:
        cache.set("local", True)
    else:
        cache.set("local", False)
    return jsonify(status=True, switch=cache.get("local"))


def haversine(point1, point2):
    """
    判断两点间距离是否在规定范围内
    :param point1: 第一个坐标点
    :param point2: 第二个坐标点
    :param limit:  两点间距离限制
    :return: true在范围内，false不在范围内
    """
    d_r = 6371.393
    lat1 = point1.get('lat')
    lng1 = point1.get('lng')
    lat2 = point2.get('lat')
    lng2 = point2.get('lng')

    lat1, lng1, lat2, lng2 = map(radians, (lat1, lng1, lat2, lng2))

    lat = lat2 - lat1
    lng = lng2 - lng1
    d = sin(lat * 0.5) ** 2 + cos(lat1) * cos(lat2) * sin(lng * 0.5) ** 2
    h = 2 * d_r * asin(sqrt(d)) * 1000
    return h

# p1 = dict(lat=31.7619253, lng=116.4700035)
# p2 = dict(lat=31.76, lng=116.475258)
#
# print haversine(p1, p2)
